package server.business.poker.util;

import java.util.HashSet;
import java.util.Set;

import server.commonData.PokerData;

/**
 * 扑克验证
 * @author King
 *
 */
public class PokerCheck
{
	
	/**13.小小牛   12.五花  11.炸弹  10.牛牛  0没牛   1~9代表牛数**/    
	public static final int XIAOXIAONIU = 13,WUHUA = 12,ZHADAN = 11,NIUNIU = 10,MEINIU=0;
	
	
	/**0黑桃>1红桃>2梅花>3方块**/
	public static final int COLOR_HEITAO = 0,COLOR_HONGTAO=1,COLOR_MEIHUA =2,COLOR_FANGKUAI = 3;
	
	
	/**
	 * 获得赔率
	 * 小小牛和五花牛 5倍
	 * 炸弹4倍
	 * 牛牛3倍
	 * 牛9和8 为2 倍
	 * 其他为1倍
	 * 
	 * @param pokerType
	 * @param niuNum
	 * @return
	 */
	public static int getPeilv(int pokerType)
	{
		if(pokerType==XIAOXIAONIU)
			return 5;
		if(pokerType==WUHUA)
			return 5;
		if(pokerType==ZHADAN)
			return 4;
		if(pokerType==NIUNIU)
			return 3;
		if(pokerType==9||pokerType==8)
			return 3;
		return 1;
	}
	
	/**
	 * 是否是小小牛
	 * 小小牛×10：五张牌皆小于等于5，总和小于等于10。
	 * @param poker
	 */
	public static boolean isXiaoxiaoNiu(int[] poker)
	{
		int totleNum = 0;
		for(int pokerNum:poker)
		{
			int num = getRealValuse(pokerNum);
			if(num>5)
				return false;
			totleNum+=num;
			if(totleNum>10)
				return false;
		}
		return true;
	}
	
	
	/**
	 * 判断选中的牌是否有
	 * @param poker
	 * @param choosePoker
	 * @return
	 */
	public static boolean hasPoker(int[] poker,int[] choosePoker)
	{
		loop:for(int chooseNum:choosePoker)
		{
			for(int pokerNum:poker)
			{
				if(chooseNum==pokerNum)
					continue loop;
			}
			return false;
		}
		return true;
	}
	
	
	/**
	 * 获得牛类型
	 * @param poker
	 * @param choosePoker
	 * @return {@link PokerCheck#XIAOXIAONIU}
	 */
	public static int getNiuType(int[] poker)
	{
		//是否是小小牛
		if(isXiaoxiaoNiu(poker))
			return XIAOXIAONIU;
		//五花
		if(isWuhua(poker))
			return WUHUA;
		//炸弹
		if(isBoom(poker))
			return ZHADAN;
		//牛牛
		if(isNiuniu(poker))
			return NIUNIU;
		//有牛
		return getNiuNum(poker);
	}
	
	
	
	/**
	 * 获得最大值
	 * @param poker
	 * @return
	 */
	public static int getMaxVal(int[] poker)
	{
		int val = 0;
		for(int pokerNum:poker)
		{
			int num = pokerNum%13;
			if(num>val)
				val = num;
		}
		return val;
	}
	
	/**
	 * 获得牌的花色
	 *   1,2,3,4,5,6,7,8,9,10,11,12,13,
        14,15,16,17,18,19,20,21,22,23,24,25,26,
        27,28,29,30,31,32,33,34,35,36,37,38,39,
        40,41,42,43,44,45,46,47,48,49,50,51,52
	 * @param pokerNum
	 * @return {@link PokerCheck#COLOR_FANGKUAI}
	 */
	private static int getColor(int pokerNum)
	{
		return pokerNum-1/13;
	}
	
	
	
	/**
	 * 获得最大值的颜色
	 * @param poker
	 * @return
	 */
	public static int getMaxValColor(int[] poker)
	{
		int val = 0;
		int trueNum = 0;
		for(int pokerNum:poker)
		{
			int num = pokerNum%13;
			if(num>val)
			{
				val = num;
				trueNum = pokerNum;
			}
		}
		return getColor(trueNum);
	}
	
	
	/**
	 * 是否是庄家赢
	 * @param zhuangPoker
	 * @param zhuangType
	 * @param otherPoker
	 * @param otherType
	 * @return
	 */
	public static boolean isZhuangJiaWin(PokerData zhuangPoker,PokerData otherPoker)
	{
		//比较牌类型大小
		if(otherPoker.getPokerType()>zhuangPoker.getPokerType())
			return true;
		if(zhuangPoker.getMaxPokerVal()>otherPoker.getMaxPokerVal())
			return true;
		if(zhuangPoker.getMaxPokerColor()>otherPoker.getMaxPokerColor())
			return true;
		return false;
	}
	
	
	/**
	 * 是否是五花
	 * 五花×6：五张牌皆为J，Q，K中任意。
	 * @param poker
	 * @return
	 */
	public static boolean isWuhua(int[] poker)
	{
		for(int pokerNum:poker)
		{
			int num = getValues(pokerNum);
			if(num!=11&&num!=12&&num!=0)
				return false;
		}
		return true;
	}
	
	/**
	 * 是否是炸弹
	 * 炸弹×5：四张同数字牌。第5张随意。
	 * @param poker
	 * @return
	 */
	public static boolean isBoom(int[] poker)
	{
		Set<Integer> set = new HashSet<Integer>(3);
		for(int pokerNum:poker)
		{
			int num = getValues(pokerNum);
			set.add(num);
			if(set.size()>2)
				return false;
		}
		return true;
	}
	
	/**
	 * 是否是牛牛
	 * 牛牛×4：三张牌数字总和为10的倍数，另两张数字总和也为10的倍数。
	 * 5张和为10的倍数  其中有任意2张和为10的倍数
	 * @param poker
	 * @return
	 */
	public static boolean isNiuniu(int[] poker)
	{
		int totleNum = 0;
		for(int temp:poker)
		{
			totleNum+= getRealValuse(temp);
		}
		if(totleNum%10!=0)
			return false;
		for(int i=0;i<poker.length;i++)
		{
			int firstNum = getRealValuse(poker[i]);
			for(int j=i+1;j<poker.length;j++)
			{
				if((firstNum+getRealValuse(poker[j]))%10==0)
					return true;
			}
		}
		return false;
	}
	
	
	/**
	 * 获得牛数
	 * @param poker
	 * @param choosePoker
	 * @return
	 */
	public static int getNiuNum(int[] poker)
	{
		int pokerLenth = poker.length;
		for(int a=0;a<pokerLenth;a++)
		{
			int firstNum = getRealValuse(poker[a]);
			for(int b=a+1;b<pokerLenth;b++)
			{
				int secondNum = getRealValuse(poker[b]);
				for(int c = b+1;c<pokerLenth;c++)
				{
					int thirdNum = getRealValuse(poker[c]);
					if((firstNum+secondNum+thirdNum)%10==0)
					{
						
						return getNiuNum(poker, new int[]{poker[a],poker[b],poker[c]});
					}
				}
			}
		}
		return MEINIU;
	}
	public static void main(String[] args) {
		System.out.println(getNiuType(new int[]{11,24,37,50,25}));
	}
	
	
	
	
	/**
	 * 获得牛数
	 * 牛八-牛七×2：三张牌数字总和为10的倍数，另两张数字总和除以10余几称牛几。牛九×3
	 * 牛六-没牛×1：三张牌数字总和为10的倍数，另两张数字总和除以10余几称牛几。
	 * @return 0没有牛 
	 */
	public static int getNiuNum(int[] poker,int[] choosePoker)
	{
		int chooseValues = 0;
		int leftValues = 0;
		loop:for(int pokerNum:poker)
		{
			int trueVal= getRealValuse(pokerNum);
			for(int chooseNum:choosePoker)
			{
				if(chooseNum==pokerNum)
				{
					chooseValues+=trueVal;
					continue loop;
				}
			}
			leftValues+=trueVal;
		}
		if(chooseValues%10!=0)
			return MEINIU;
		return leftValues%10;
	}
	
	
	/**
	 * 获得扑克的值
	 * J Q K为 11 12 0
	 * @param pokerNum
	 * @return
	 */
	public static int getValues(int pokerNum)
	{
		return pokerNum%13;
	}
	
	
	/**
	 * 获得扑克的值
	 * 1代表A   13代表k  14代表A
	 * J Q K 为10
	 * @param pokerNum
	 * @return
	 */
	public static int getRealValuse(int pokerNum)
	{
		int trueVal = pokerNum%13;
		//K在此转换后为0  应该变为10 J转换后为11 Q为12  则应该为10
		if(trueVal==0||trueVal>10)
			return 10;
		return trueVal;
	}
}
